package com.hyper_yang.javase.multiThread.notify.base;

/*
线程之间的通信:
    线程之间彼此的交流
    等待、唤醒的机制
    wait() 无限期等待
    notify() 唤醒，如果有多个线程在等待，随机唤醒一个线程
    notifyAll() 唤醒，唤醒所有等待的线程
    * 注意: 方法都来自于 Object
        锁对象调用线程通信方法
        都只能在同步代码块、同步方法里执行
        wait() 会释放锁
 */
public class Base { // 这个不合理 ！！！
    public static void main(String[] args) throws InterruptedException {
        Thread cook = new Thread(new CookRunnable(), "湘菜大厨");

        Thread waiter = new Thread(new WaiterRunnable(), "小二");

        cook.start();

        waiter.start();
    }
}

class Bar {
    // 记录菜品的数量
    int count;
}

class CookRunnable implements Runnable {
    Bar bar = new Bar();

    @Override
    public void run() {
        while (true) {
            if (bar.count >= 10) {
                System.out.println("吧台满了，服务员快端菜");
                break;
            }
            // 做菜
            bar.count++;
            System.out.println(Thread.currentThread().getName() + "做了一道菜，吧台上有" + bar.count + "道菜");
        }
    }
}

class WaiterRunnable implements Runnable {
    Bar bar = new Bar();

    @Override
    public void run() {
        while (true) {
            if (bar.count <= 0) {
                System.out.println("吧台空了，厨师快做菜");
                break;
            }
            // 端菜
            bar.count--;
            System.out.println(Thread.currentThread().getName() + "端走了一道菜，吧台剩余" + bar.count + "道菜");
        }
    }
}